
<%
	//Info jsp
	/** 
	 *  pagina che restituisce le migliori offerte del mese relative a voli tra aereoporti o città o nazioni
	 * @author Alessandro  Nasso
	 * @version  2.0
	 */
%>

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1" import="beans.*" import="java.util.*"
	import="java.text.*"%>


<%
	//-----------------------------------------------------------------
%>
<%
	//serve per effettuare le query
%>
<jsp:useBean id="number" scope="page" class="beans.Number" />
<jsp:useBean id="verifica" scope="page" class="beans.VerificaCampi" />
<jsp:useBean id="dbConn" scope="page" class="beans.Query1" />
<%
	//-----------------------------------------------------------------
%>


<%
	String scalo = null, anno = null, mese = null, aa = null, ad = null, ca = null, cd = null, na = null, nd = null;
	Integer year;

	scalo = request.getParameter("scalo");
	mese = request.getParameter("mese");
	aa = request.getParameter("aa");
	ad = request.getParameter("ad");
	ca = request.getParameter("ca");
	cd = request.getParameter("cd");
	na = request.getParameter("na");
	nd = request.getParameter("nd");
	anno = request.getParameter("anno");

	// 1 controllo i dati inseriti
	//controllare per quei valori che possono essere nulli se non lo sono che siano valori adeguati?

	// mese deve essere un numero (tra uno e dodici)
	// aa, ad devono essere solo lettere (maiuscole solo 3) o nulli
	// ca, cd devono essere nomi di città (controllo solo che siano solo lettere, ?)o nulli
	// na, nd dovrebbe essere lo stesso della città o nulli
	// anno deve essere un numero (sarebbe meglio definire un intervallo)

	if (verifica.verificaMese(mese)
			&& (verifica.verificaAnno(anno) || (anno == null)
					|| (anno.compareTo("null") == 0) || (anno
					.compareTo("") == 0))
			&& ((ad == null) || (ad.compareTo("null") == 0)
					|| (ad.compareTo("") == 0) || (verifica
						.verificaAero(ad)))
			&& ((aa == null) || (aa.compareTo("null") == 0)
					|| (aa.compareTo("") == 0) || (verifica
						.verificaAero(aa)))
			&& ((cd == null) || (cd.compareTo("null") == 0)
					|| (cd.compareTo("") == 0) || (verifica
						.verificaCitta(cd)))
			&& ((ca == null) || (ca.compareTo("null") == 0)
					|| (ca.compareTo("") == 0) || (verifica
						.verificaCitta(ca)))
			&& ((nd == null) || (nd.compareTo("null") == 0)
					|| (nd.compareTo("") == 0) || (verifica
						.verificaNazione(nd)))
			&& ((na == null) || (na.compareTo("null") == 0)
					|| (na.compareTo("") == 0) || (verifica
						.verificaNazione(na)))) {

		// creo un calendario per stampare tutti i giorni del mese con associato il giorno etc..
		Calendar giorno = Calendar.getInstance();

		// se non è passato l'anno setto quello attuale
		if ((anno == null) || (anno.compareTo("null") == 0)
				|| (anno.compareTo("") == 0)) {
			year = giorno.get(Calendar.YEAR);
		} else
			year = Integer.parseInt(anno);

		// ------------------------------------- creazione query ----------------------------------------------

		String query = "", from = "";
		boolean good_query = true;
		//---------------------------------- distinzione se con scali o meno ------------------------------------
		if (scalo.compareTo("si") == 0) {
			from = "SELECT day(oraP1) as giorno, min(prezzo_tot) as prezzo FROM view_1scalo as V";

			// aeroporto partenza
			if ((ad != null) && (ad.compareTo("null") != 0)
					&& (ad.compareTo("") != 0)) {
				query += " WHERE lower(V.partenza1)=" + "lower('"
						+ ad.replace("'", "''") + "')"
						+ " AND month(V.oraP1)=" + mese
						+ " AND year(V.oraP1)=" + year;
			} else // città partenza
			if ((cd != null) && (cd.compareTo("null") != 0)
					&& (cd.compareTo("") != 0)) {
				from += ", citta C, aereoporti A ";

				query += " WHERE month(V.oraP1)="
						+ mese
						+ " AND year(V.oraP1)="
						+ anno
						+ " AND lower(C.nome)="
						+ "lower('"
						+ cd.replace("'", "''")
						+ "')"
						+ " AND A.CodCitta=C.idCitta AND A.idAereoporto=V.partenza1";
			} else // nazione partenza
			if ((nd != null) && (nd.compareTo("null") != 0)
					&& (nd.compareTo("") != 0)) {
				from += ", nazioni N, citta C, aereoporti A ";
				query += " WHERE month(V.oraP1)="
						+ mese
						+ " AND year(V.oraP1)="
						+ year
						+ " AND lower(N.Nome)="
						+ "lower('"
						+ nd.replace("'", "''")
						+ "')"
						+ "  AND C.codNazione=N.idNazioni AND A.CodCitta=C.idCitta AND A.idAereoporto=V.partenza1";
			} else
				// se sono qui mancava qualche dato per la partenza
				good_query = false;

			if (good_query)
				// aeroporto destinazione
				if ((aa != null) && (aa.compareTo("null") != 0)
						&& (aa.compareTo("") != 0)) {
					query += " AND lower(V.destinazione2)=" + "lower('"
							+ aa.replace("'", "''") + "') ";
				} else // città destinazione
				if ((ca != null) && (ca.compareTo("null") != 0)
						&& (ca.compareTo("") != 0)) {
					from += ", citta C1, aereoporti A1 ";
					query += " AND lower(C1.nome)="
							+ "lower('"
							+ ca.replace("'", "''")
							+ "')"
							+ " AND A1.CodCitta=C1.idCitta AND A1.idAereoporto=V.destinazione2";
				} else // nazione destinazione
				if ((na != null) && (na.compareTo("null") != 0)
						&& (na.compareTo("") != 0)) {
					from += ", nazioni N1, citta C1, aereoporti A1 ";
					query += " AND lower(N1.Nome)="
							+ "lower('"
							+ na.replace("'", "''")
							+ "')"
							+ " AND C1.codNazione=N1.idNazioni AND A1.CodCitta=C1.idCitta AND A1.idAereoporto=V.destinazione2";
				} else
					// se sono qui mancava qualche dato per la destinazione
					good_query = false;
			query = from + query;
			query += " GROUP BY day(V.oraP1) ;";

		}
		//---------- fine ricerca con scalo	-------------------------------------------------------------

		else {
			from = "SELECT day(V.oraP) as giorno, min(V.prezzo) FROM voli V ";

			// aeroporto partenza
			if ((ad != null) && (ad.compareTo("null") != 0)
					&& (ad.compareTo("") != 0)) {
				query += " WHERE month(V.oraP)= " + mese
						+ " AND year(V.oraP)=" + year
						+ " AND lower(V.partenza)=" + "lower('"
						+ ad.replace("'", "''") + "')";
			} else // città partenza
			if ((cd != null) && ((cd.compareTo("null") != 0))
					&& (cd.compareTo("") != 0)) {
				from += ", citta C, aereoporti A ";

				query += " WHERE month(V.oraP)= "
						+ mese
						+ " AND year(V.oraP)="
						+ year
						+ " AND lower(C.nome)="
						+ "lower('"
						+ cd.replace("'", "''")
						+ "')"
						+ " AND A.CodCitta=C.idCitta AND A.idAereoporto=V.partenza";
			} else // nazione partenza
			if ((nd != null) && (nd.compareTo("null") != 0)
					&& (nd.compareTo("") != 0)) {
				from += ", nazioni N, citta C, aereoporti A ";
				query += " WHERE month(V.oraP)= "
						+ "'"
						+ mese
						+ "'"
						+ " AND year(V.oraP)="
						+ year
						+ " AND lower(N.Nome)="
						+ "lower('"
						+ nd.replace("'", "''")
						+ "')"
						+ "  AND C.codNazione=N.idNazioni AND A.CodCitta=C.idCitta AND A.idAereoporto=V.partenza";
			} else
				// se sono qui mancava qualche dato per la partenza
				good_query = false;

			// aeroporto destinazione
			if ((aa != null) && (aa.compareTo("null") != 0)
					&& (aa.compareTo("") != 0)) {
				query += " AND lower(V.destinazione)=" + "lower('"
						+ aa.replace("'", "''") + "') ";
			} else // città destinazione
			if ((ca != null) && (ca.compareTo("null") != 0)
					&& (ca.compareTo("") != 0)) {
				from += ", citta C1, aereoporti A1 ";
				query += " AND lower(C1.nome)="
						+ "lower('"
						+ ca.replace("'", "''")
						+ "')"
						+ " AND A1.CodCitta=C1.idCitta AND A1.idAereoporto=V.destinazione";
			} else // nazione destinazione
			if ((na != null) && (na.compareTo("null") != 0)
					&& (na.compareTo("") != 0)) {
				from += ", nazioni N1, citta C1, aereoporti A1 ";
				query += " AND lower(N1.Nome)="
						+ "lower('"
						+ na.replace("'", "''")
						+ "')"
						+ " AND C1.codNazione=N1.idNazioni AND A1.CodCitta=C1.idCitta AND A1.idAereoporto=V.destinazione";
			} else
				// se sono qui mancava qualche dato per la destinazione
				good_query = false;
			query = from + query;
			query += " GROUP BY day(V.oraP) ;";
		}

		//out.print(query);
		//------------------------------------------------------------------------------------------------------------------------------------------------------

		// verifico che la query sia opportuna
		if (good_query) {

			// parametri usati dalla pagina inclusa sotto
			request.setAttribute("prelievo", "true");
			request.setAttribute("query", query);

			// out.print(request.getAttribute("query"));
%>
<jsp:include page="/gestore_query.jsp" />

<%
			String data = null; // indicherà il giorno specifico
			SimpleDateFormat sdf = new SimpleDateFormat(
					"EEEE dd MMMMM yyyy"); // setto il formato in cui voglio la data

			// recupero i risultati
			String[][] offerte = dbConn.getDati(query);

			// out.print(offerte[1][1]);

			if (offerte != null) {

				// recupero i numeri delle colonne

				//-------------------------------------------
				Integer colonna_giorno = 0, colonna_prezzo = 1;
				//---------------------------------------------

				/*
				 for(int i=0; i<offerte[0].length;i++)
				 {

				 if(offerte[0][i].compareTo("giorno")==0) 
				 {
				 colonna_giorno= i;
				 }

				 if(offerte[0][i].compareTo("prezzo")==0) 
				 {
				 colonna_prezzo= i;
				 }
				
				 }// fine for recupero nomi colonne
				 */

				//out.print(offerte.length);

				//------------------------------------------------------------------- 3 stampo a video i risultati

				boolean volo_in_giorno = false; // serve per sapere se in quel giorno c'è un volo

				// ciclo per stampare a video i vari giorni
				for (int i = 1; i <= giorno.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {

					// imposto il giorno 
					giorno.set(year, Integer.parseInt(mese) - 1, i);

					data = sdf.format(giorno.getTime());

					// stampo il numero del giorno 
					out.print(data);

					volo_in_giorno = false;

					for (int j = 1; j < offerte.length; j++) {
						if (i == Integer
								.parseInt(offerte[j][colonna_giorno])) {
							out.print(", " + offerte[j][colonna_prezzo]
									+ ";");
							volo_in_giorno = true;
						}
					}

					if (!volo_in_giorno) {
						out.print(", 0;");
					}

				}

			}// fine se offerte non nulle
			else {
				// ---------------------------- se le offerte erano nulle deve restituire tutto il mese con zero per ogni giorno

				// ciclo per stampare a video i vari giorni
				for (int i = 1; i <= giorno
						.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {

					// imposto il giorno 
					giorno.set(year, Integer.parseInt(mese) - 1, i);

					// recupero la data nel formato voluto 
					data = sdf.format(giorno.getTime());

					// stampo il numero del giorno e lo 0 
					out.print(data + ", 0;");
				}
			}

		}// fine controllo sia una buona query (contenga i dati necessari)
		else {
			out.print("non sono stati inseriti tutti i campi");
		}

	}// se qualche dato non è idoneo
	else
		out.print("uno o pi&ugrave campi non corretti");
%>
